package com.party.core.service.crowdfund;

import com.party.common.paging.Page;
import com.party.core.model.crowdfund.*;
import com.party.core.model.member.Member;
import com.party.core.service.IBaseService;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 众筹项目服务接口
 * Created by wei.li
 *
 * @date 2017/2/16 0016
 * @time 18:39
 */
public interface IProjectService extends IBaseService<Project> {

    /**
     * 分页查询项目信息
     * @param param 项目信息
     * @param page 分页信息
     * @return 项目列表
     */
    List<Project> listPage(HashMap<String, Object> param, Page page);

    /**
     * 查询所有项目信息
     * @param param 项目信息
     * @return 项目列表
     */
    List<Project> list(HashMap<String, Object> param);


    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 项目列表
     */
    List<ProjectWithAuthor> listPage(ProjectWithAuthor projectWithAuthor, Page page);

    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 项目列表
     */
    List<ProjectWithAuthor> listForDistributorId(ProjectWithAuthor projectWithAuthor, Page page);

    /**
     * 联合查询所有项目列表
     * @param projectWithAuthor 查询参数
     * @return 项目列表
     */
    List<ProjectWithAuthor> list(ProjectWithAuthor projectWithAuthor);

    /**
     * 获取项目信息包含创建者
     * @param id 编号
     * @return 项目信息
     */
    ProjectWithAuthor getWithAuthor(String id);

    /**
     * 是否筹集成功
     * @param targetAmount 目标筹集资金
     * @param actualAmount 实际筹集资金
     * @return 是否筹集成功（true/false）
     */
    boolean isSuccess(Float targetAmount, Float actualAmount);


    /**
     * 众筹退款失败
     * @param project
     * @return
     */
    int crowdfundRefundFaile(Project project);

    /**
     * 获取实际能筹集的最大金额
     * @param id 众筹编号
     * @return 最大金额
     */
    Double getMaxAmount(String id);

    /**
     * 根据分销编号查询众筹项目
     * @param distributionId 分销编号
     * @return 众筹项目列表
     */
    List<Project> listForDistributionId(String distributionId);

    /**
     * 根据目标查询众筹项目
     * @param targetId 目标编号
     * @return 项目列表
     */
    List<Project> listForTargetId(String targetId);

    Double getTotalAmountForTargetId(String targetId);

    /**
     * 根据用户编号查询众筹项目
     * @param authorId 用户编号
     * @param eventId 主题编号
     * @return 众筹列表
     */
    List<Project> listForAuthorId(String authorId, String eventId);

    /**
     * 查询带起众筹
     * @return 众筹列表
     */
    List<ProjectWithAuthor> endList();


    /**
     * 进行中的众筹
     * @return 众筹列表
     */
    List<ProjectWithAuthor> underwayList();

    /**
     * 众筹成功的
     * @return 众筹列表
     */
    List<ProjectWithAuthor> successList();

    /**
     * 所有众筹
     * @return 众筹列表
     */
    List<ProjectWithAuthor> allList();

    /**
     * 进行中的
     * @param targetId 目标编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> underwayList(String targetId);

    /**
     * 成功的
     * @param targetId 目标编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> successList(String targetId);

    /**
     * 所有
     * @param targetId 目标编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> allList(String targetId);

    /**
     * 事件下众筹中
     * @param eventId 事件编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> eventUnderwayList(String eventId);

    /**
     * 事件成功众筹
     * @param eventId 事件编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> eventSuccessList(String eventId);

    /**
     * 事件下所有众筹
     * @param eventId 事件编号
     * @return 众筹列表
     */
    List<ProjectWithAuthor> eventAllList(String eventId);

    /**
     * 众筹是否过期
     * @param project 众筹项目
     * @return 众筹是否过期(true/false)
     */
    boolean isOverdue(Project project);

    /**
     * 项目下众筹数
     * @param targetId 项目编号
     * @param relationId 分销关系
     * @return 众筹数
     */
    Integer sizeForTargetId(String targetId, String relationId, Integer isSuccess);

    /**
     * 项目下的众筹数
     * @param targetId 项目编号
     * @return 众筹数
     */
    Integer sizeForTargetId(String targetId);

    /**
     * 项目下的众筹数
     * @param targetId 项目编号
     * @param isSuccess 状态
     * @return 众筹数
     */
    Integer sizeForTargetId(String targetId, Integer isSuccess);

    /**
     * 项目下的直接付款众筹数
     * @param targetId
     * @param isSuccess
     * @param payType
     * @return
     */
    Integer directPaySizeForTargetId(String targetId, Integer isSuccess,Integer payType);

    /**
     * 根据事件编号查询项目
     * @param eventId 事件编号
     * @return 项目数
     */
    Integer countForEvent(String eventId);

    /**
     * 根据事件编号查询项目
     * @param eventId 事件编号
     * @param isSuccess 状态
     * @return 项目数
     */
    Integer countForEvent(String eventId, Integer isSuccess);


    /**
     * 根据事件编号查询直接付款众筹项目
     * @param eventId 事件编号
     * @param isSuccess 状态
     * @return 项目数
     */
    Integer dpCountForEvent(String eventId, Integer isSuccess);


    /**
     * 众筹分析列表
     * @param projectAnalyze 众筹分析
     * @param page 分页参数
     * @return 众筹分析列表
     */
    List<ProjectAnalyze> analyzeList(ProjectAnalyze projectAnalyze, Page page);

    /**
     * 众筹分析列表
     * @param projectAnalyze 众筹分析
     * @param groupBy 是否分组
     * @param page 分页参数
     * @return 列表
     */
    List<ProjectAnalyze> analyzeList(ProjectAnalyze projectAnalyze, boolean groupBy, Page page);


    /**
     * 其他的众筹
     * @param projectId 众筹
     * @return 众筹列表
     */
    List<ProjectWithAuthor> otherProject(String projectId);


    /**
     * 项目下众筹支持者总数
     * @param targetId 目标编号
     * @return 支持者总数
     */
    Integer sumfavorerNum(String targetId);

    /**
     * 支持者众筹中
     * @param eventId 事件编号
     * @param targetId 目标编号
     * @param projectId 项目编号
     * @return 众筹数
     */
    Integer numOfSupport(String eventId, String targetId, String projectId);

    /**
     * 统计活动众筹
     * @param activityId 活动编号
     * @param status 状态
     * @return 统计数
     */
    Integer countByActivity(String activityId, Integer status);


    /**
     * 统计众筹
     * @param eventId 事项编号
     * @param status 状态
     * @return 统计数
     */
    Integer countByEvent(String eventId, Integer status);

    /**
     * 统计活动众筹总资金
     * @param projectAnalyze
     * @return
     */
    Double sumForActualAmount(ProjectAnalyze projectAnalyze,Integer amountType);

    /**
     * 获取项目或者活动的总金额
     * @param projectAnalyze
     * @return
     */
    Double sumProjectOREventAmount(ProjectAnalyze projectAnalyze,Integer amountType);

    /**
     * 获取初始化众筹用时的数据
     * @return
     */
    List<Project> getInitUseTimeData();

    /**
     * 统计众筹成功人数
     * @param memberId 发布者
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计数
     */
    Integer countByDate(String memberId, String startDate, String endDate);

    /**
     * 统计总成成功人数
     *
     * @param memberId 发布者
     * @return 成功人数
     */
    Integer count(String memberId);


    /**
     * 统计众筹项目下的浏览量
     * @param targetId 众筹项目编号
     * @return 浏览量
     */
    Integer viewNumForTargetId(String targetId);

    /**
     * 根据用户和项目id获取众筹
     * @param targetId 项目id
     * @param authorId 用户id
     * @return
     */
    Project findByTargetWithAuthor(String targetId, String authorId);

    /**
     * 查询某机构下的所有众筹名者
     * @param partnerId
     * @return
     */
    List<Member> getZcMembersByPartnerId(String partnerId);

    /**
     * 按分组查到某机构某会员的众筹数和众筹金额(众筹中和众筹cd成功的)
     * @return
     */
    List<Map<String, Object>> getAllGroup(Integer status, String partnerId, String memberId);

    /**
     * 数据分析的统计
     * @param startDate
     * @param endDate
     * @return
     */
    Map<String, Object> countAnalyzeByDate(String startDate, String endDate, Map<String, Object> params);
    /**
     * 根据当前项目id和目标编号获取已报名且众筹状态正确的众筹
     * @param targetId 目标编号
     * @param sourceId 当前项目id
     * @return 众筹列表
     */
    List<ProjectBatchTransfer> findByTargetWithSource(String targetId, String sourceId);
    /**
     * 根据当前项目id和目标编号获取未报名的
     * @param targetId 目标编号
     * @param sourceId 当前项目id
     * @return 众筹列表
     */
    List<Project> findByTargetWithSourceNotInvolved( String targetId, String sourceId);

    /**
     * 数据报表
     * @param input
     * @return
     */
    ProjectDetailCountOutput getDataTable(ProjectDetailCountInput input);

    /**
     * 合作商某天的众筹成功人数
     * @param successDate
     * @param partnerId
     * @return
     */
    Integer countBySuccessDate(Date successDate, String partnerId);

    /**
     * 根据用户编号查询项目发布者
     *
     * @param authorId 用户编号
     * @return 项目发布者编号集合
     */
    List<String> getPartnerIdByAuthorId(String authorId);

    /**
     * 联合查询创建者
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> listTransferWithAuthorPage(ProjectWithAuthor projectWithAuthor, Page page);

    /**
     * 根据支付订单id获取众筹者信息
     *
     * @param orderId 订单id
     * @return 众筹者信息
     */
    ProjectWithAuthor getProjectAuthorByOrder(String orderId);

    /**
     * 统计众筹成功人数
     * @param memberId 发布者
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计数
     */
    Integer disCount(String memberId, String startDate, String endDate);

    List<String> findByOpenId(String openId);

    /**
     * 获取我的众筹
     * @param targetId 项目id
     * @param authorId 用户id
     * @return
     */
    Project getMyProject(String targetId, String authorId);

    List<Project> inits();

    /***
     * 根据项目id找该项目下所有的报名者
     * @param activityId
     * @return
     */
    List<Project> getProjectByActivityId(String activityId,Page page);

    /***
     * 根据项目id 获取主题下面所有的报名人员
     * @param activityId
     * @param page
     * @return
     */
    List<Project> queryProjectByTargetId(String activityId, Page page);

    /***
     * 个人排行榜
     * @param targetId
     * @param page
     * @return
     */
    List<Project> popularityList(String targetId, Page page,String type);

    /***
     * 个人排行榜  自己的个人信息
     * @param targetId
     * @param
     * @return
     */
    Project popularity(String targetId, String type, String id);

    Project getByMemberId(String targetId, String id);

    /***
     * 根据项目id和supportId找报名者
     * @param supportId
     * @param targetId
     * @return
     */
    Project getProjectByMemberId(String supportId, String targetId);

    List<ProjectWithAuthor> listForMySupport(ProjectWithAuthor projectWithAuthor, Page page);

    /***
     * 根据actId修改ProjectTitle
     * @param actId
     * @return
     */
    void updateProjectTitle(String actId);

    /***
     * 众筹者转移初始化LastSupportDate
     * @return
     */
    List<Project> transferLastSupportDate();

    List<ProjectWithAuthorOutput> listForActGradation(ProjectWithAuthor projectWithAuthor, Map<String,Object> params, Page page);

    List<ProjectWithAuthor> batchList(HashMap<String, Object> params, Page page);


    /**
     * 联合查询创建者__多场
     * @param projectWithAuthor 查询参数
     * @param page 分页参数
     * @return 众筹列表
     */
    List<ProjectWithAuthor> gradationListWithAuthorPage(ProjectWithAuthor projectWithAuthor, Page page);

    /**
    * @Description:  根据众筹者报名的众筹类型（单/多场）来选择替换
    * @Param:  project
    * @return:  project
    * @Author: Hua Qunhao
    * @Date: 2019-03-28-0028
    */
    Project isGradationReplace(Project project,EventGradation ongoingGradation) throws Exception;

    /**
     * @param isSuccess 成功状态
     * @param projectId 众筹id
     * @return
     * @Author yifeng
     * @Description 更新isSuccess
     * @Date 16:23 2019/3/28
     **/
    void updateIsSuccess(Integer isSuccess, String projectId);

    /**
     * @Author hzq
     * @Description //找到这个活动下面的所有报名人员
     * @Date 17:51 2019/4/10
     * @param eventId
     * @return
     */
    List<Project> findByEventId(String eventId);

    /**
     * @param projectId 众筹id
     * @return
     * @Author yifeng
     * @Description 获取众筹的累计金额和支持数量
     * @Date 13:57 2019/4/12
     **/
    Project getSupportMoneyAndCount(String projectId);

    /**
     * 统计众筹项目下的浏览量
     * @param eventId 目标编号
     * @return 浏览量
     */
    Integer viewNumForEventId(String eventId);


    /**
     * @Description: 判断众筹者是否可以退款
     * @Param:  projectId
     * @return: isCan
     * @Author: Hua Qunhao
     * @Date: 2019-04-29-0029
     */
    boolean isCanRefund (String projectId);


    List<CrowdfundingBattleReport> getProjectBattleReport(Map<String,Object> param ,Integer type);
}
